/*
 * WerknemerAdmin.cc
 *
 *  Created on: Sep 9, 2011
 *      Author: walter
 */

#include "WerknemerAdmin.h"
WerknemerAdmin::WerknemerAdmin() {
	werknemers = new map<int, RefHandle<Werknemer> > ;
	beschikbareWerknemerNummers = new vector<int> ;
	hoogsteWerknemerNummer = 0;
	ka = KooiAdmin::instance();
}
WerknemerAdmin::~WerknemerAdmin() {
	//	//werknemers  lijst leeg gooien
	for (map<int, RefHandle<Werknemer> >::iterator iter = werknemers->begin(); iter != werknemers->end(); ++iter) {
		cout << "bezig met verwijderen van: " << iter->second->getNaam() << endl;
		//delete iter->second;
		iter->second.~RefHandle();
		cout << "verwijderd" << endl;
	}
	delete werknemers;

}

void WerknemerAdmin::werknemerToevoegen() {

	string werknemerNaam;
	int werknemerLeeftijd;
	string categorie;

	cout << "\nGeef op een regel, gescheiden door spatie(s) de naam, "
		"de leeftijd en de categorie van de werknemer op \n";
	// lees de gegevens in
	cin >> werknemerNaam >> werknemerLeeftijd >> categorie;
	// skip de rest van de regel
	cin.ignore(100, '\n');

	int wnNR = getWerknemerNummer();

	cout << "wnNR = " << wnNR << endl;

	if (categorie != "" && werknemerNaam != "" && werknemerLeeftijd != 0) {
		if (categorie == "administrateur") {
			//RefHandle<Werknemer> administrateur(new Administrateur(werknemerNaam, werknemerLeeftijd, categorie));

			Administrateur * administrateur = new Administrateur(werknemerNaam, werknemerLeeftijd, categorie);
			RefHandle<Werknemer> adminHandle(administrateur);

			werknemers -> insert(make_pair(wnNR, adminHandle));
			//werknemerToevoegen(wnNR, administrateur, categorie);
			cout << "Werknemer met naam: " << werknemerNaam << " is aangenomen als " << categorie << endl;
		}

		else if (categorie == "oppasser") {
			Oppasser*  oppasser = new Oppasser(werknemerNaam, werknemerLeeftijd, categorie);

			string kooiSoort;

			ka->drukKooienInhoudAf();

			cout << "\n Geef de naam van 1 van de bovenstaande diersoorten(Kooien) die de oppasser moet beheren:  \n";

			// lees de gegevens in
			cin >> kooiSoort;

			// skip de rest van de regel
			cin.ignore(100, '\n');

			cout << "Gekozen diersoort: " << kooiSoort << endl;

			map<string, RefHandle<Kooi> >::iterator iter = ka->getKooien()->find(kooiSoort);

			if (!(iter == ka->getKooien()->end())) {
				oppasser->setKooi(iter->second);
			} else {
				cout << "geen geldige kooisoort gevonden om aan de oppasser te koppelen" << endl;
			}

//			werknemerToevoegen(wnNR, (RefHandle<Werknemer>)oppasser, categorie);
			RefHandle<Werknemer> oppasHandle(oppasser);

			werknemers -> insert(make_pair(wnNR, oppasHandle));

			cout << "Werknemer met naam: " << werknemerNaam << " is aangenomen als " << categorie << endl;
		}

		else if (categorie == "manager") {
			Manager* mana = new Manager(werknemerNaam, werknemerLeeftijd, categorie);

			cout << "Hoeveel ondergeschikten wilt u toevoegen aan uw onderschiktenlijst" << endl;
			int onderGeschiktenAantal;

			cin >> onderGeschiktenAantal;

			if (onderGeschiktenAantal != 0) {
				assert(werknemers->size()!=0);
				cout << "Geef de werknemernummer op van de persoon die u wilt toevoegen als uw ondergeschikte" << endl;
				toonAlleWerknemers();
				int NR;
				while (onderGeschiktenAantal != 0) {
					cin >> NR;
					cout << "Bezig met zoeken naar werknemer met nr " << NR << endl;
					map<int, RefHandle<Werknemer> >::iterator iter = werknemers->find(NR);
					if (iter->second != 0) {
						cout << "Werknemer gevonden  met nr " << NR << endl;
						mana->vulOndergeschiktenLijst(iter->second);
						onderGeschiktenAantal--;
					} else {
						cout << "werknemer met nummer: " << NR << " niet gevonden." << endl;
						break;
					}
				}
				cout << "Manager wordt opgeslagen met " << mana->getOndergeschiktenLijst()->size() << " ondergeschikte(n)" << endl;
			} else {
				cout << "Geen ondergeschikten geselecteerd. Manager wordt opgeslagen zonder ondergeschikten" << endl;
			}

			//werknemerToevoegen(wnNR, mana, categorie);
			RefHandle<Werknemer> manaHandle(mana);

			werknemers -> insert(make_pair(wnNR, manaHandle));
			cout << "Done " << endl;

		} else {
			beschikbareWerknemerNummers->push_back(wnNR);
			cout << "Niet bestaande soort werknemer\n";
		}
	}

}

void WerknemerAdmin::werknemerVerwijderen() {
	cout << endl << "Geef op een regel, gescheiden door spatie(s) het"
		" werknemernummer op van de persoon die verwijderd moet worden." << endl;

	int werknemerNummer;

	cin >> werknemerNummer;

	map<int, RefHandle<Werknemer> >::iterator iter = werknemers->find(werknemerNummer);

	if (iter == werknemers->end()) {
		cout << "De niet hardwerkende werknemer met nummer " << werknemerNummer << "is niet gevonden" << endl;
	} else {
		werknemers->erase(werknemerNummer);

		beschikbareWerknemerNummers->push_back(werknemerNummer);

		iter->second.~RefHandle();
		cout << "Werknemer met nummer: " << werknemerNummer << " is ontslagen" << endl;
	}
	cout << "done " << endl;

}

int WerknemerAdmin::getWerknemerNummer() {
	if (beschikbareWerknemerNummers->size() > 0) {
		vector<int>::iterator iter = beschikbareWerknemerNummers->begin();

		cout << "return: " << (*iter) << endl;

		beschikbareWerknemerNummers->erase(iter);
		return (*iter);

	} else {

		return hoogsteWerknemerNummer++;

	}
}
void WerknemerAdmin::toonAlleWerknemers() {

	cout << "Lijst van alle werknemers" << endl;
	cout << werknemers->size() << endl;
	// itereer over alle werknemers uit de lijst van werknemers
	for (map<int, RefHandle<Werknemer> >::iterator iter = werknemers->begin(); iter != werknemers->end(); ++iter) {
		cout << "Werknemernummer: " << iter->first << endl;
		iter->second->drukaf();
	}
	cout << endl;

}

void WerknemerAdmin::printSalarisPost(){
	int salarisPost = 0;
	for (map<int, RefHandle<Werknemer> >::iterator iter = werknemers->begin(); iter != werknemers->end(); ++iter) {
		salarisPost += iter->second->berekenSalaris();
	}
	cout << "Salarispost: " << salarisPost<< endl;
}

map<int, RefHandle<Werknemer> >* WerknemerAdmin::getWerknemers() {
	return werknemers;
}
